package dao

import (
	"context"
	"database/sql"
	"time"
	"xorm.io/xorm"
)

type IAccountDAO interface {
	Insert(ctx context.Context, u Account) error
}

type XORMAccountDAO struct {
	db *xorm.Engine
}

func CreateAccountDAO(db *xorm.Engine) IAccountDAO {
	err := db.Sync(new(Account))
	if err != nil {
	}
	return &XORMAccountDAO{db: db}
}

func (G *XORMAccountDAO) Insert(ctx context.Context, u Account) error {
	now := time.Now().UnixMilli()
	u.Ctime = now
	u.Utime = now
	_, err := G.db.Insert(&u)
	return err
}

type Account struct {
	Id int64 `xorm:"pk autoincr"`
	// 代表这是一个可以为 NULL 的列
	//Email    *string

	//Email    sql.NullString `gorm:"unique"`
	Email    sql.NullString `xorm:"varchar(255)  unique 'email'"`
	Password string
	//Nickname string `gorm:"type=varchar(128)"`
	Nickname string `xorm:"varchar(128)"`

	// YYYY-MM-DD
	Birthday int64
	AboutMe  string `xorm:"varchar(4096)"`

	// 代表这是一个可以为 NULL 的列
	Phone sql.NullString `xorm:"unique"`

	// 1 如果查询要求同时使用 openid 和 unionid，就要创建联合唯一索引
	// 2 如果查询只用 openid，那么就在 openid 上创建唯一索引，或者 <openid, unionId> 联合索引
	// 3 如果查询只用 unionid，那么就在 unionid 上创建唯一索引，或者 <unionid, openid> 联合索引
	WechatOpenId  sql.NullString `xorm:"unique"`
	WechatUnionId sql.NullString

	// 时区，UTC 0 的毫秒数
	// 创建时间
	Ctime int64
	// 更新时间
	Utime int64

	// json 存储
	//Addr string
}
